// 《围棋》作者版权所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package runtime

import "unsafe"

var labelSync uintptr

// go:linkname runtime\u setProfLabel runtime/pprof.runtime\u setProfLabel 
func runtime_setProfLabel(labels unsafe.Pointer) {
	// 引入竞争优势，通过配置文件进行回读。
	// 这将更正确地使用&getg（）.labels作为同步地址，
	// 但我们在信号处理程序中进行读取，因此无法调用竞赛运行时。
	// 
	// 这使用了racereleasemerge而不仅仅是racerelease，因此
	// proffuf.read中的acquire与*all*之前的
	// setProfLabel操作同步，而不仅仅是最新的操作。此
	// 非常重要，因为profBuf.read将观察到不同的
	// 标签，这些标签是由
	// 不同的goroutine上的不同setProfLabel操作设置的，因此它需要与所有
	// 进行同步（如果我们可以在&getg（）上同步
	// 就不会有问题）.标签，因为我们将与每个
	// 最新的标签分别写入。）
	// 
	// racereleasemerge类似于对
	// labelSync的完全读取-修改-写入，而不仅仅是一个存储版本，因此它对以前的racereleasemerge具有依赖性，其中
	// 最终结转至profBuf.read中的收购。
	if raceenabled {
		racereleasemerge(unsafe.Pointer(&labelSync))
	}
	getg().labels = labels
}

// go:linkname runtime\u getProfLabel runtime/pprof.runtime\u getProfLabel 
func runtime_getProfLabel() unsafe.Pointer {
	return getg().labels
}
